#!/bin/bash
###############################################################################
#       脚本名称: appender_console.sh
#       功能描述: 控制台输出器,将日志输出到终端(stdout/stderr)。
#       作者: 林再来
#       日期: 2025-10-14
#       版本: 1.0
#       功能:
#           1、支持彩色输出(ANSI颜色码)
#           2、支持输出到stdout或stderr
#           3、自动检测终端类型
#           4、支持日志级别颜色高亮
#       依赖(插件/命令):
#           tput(可选,用于高级终端控制)
###############################################################################

# 防止重复加载
[[ -n "${_APPENDER_CONSOLE_LOADED:-}" ]] && return 0
readonly _APPENDER_CONSOLE_LOADED=1

# 加载依赖模块
_APPENDER_CONSOLE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${_APPENDER_CONSOLE_DIR}/../core/log_level.sh"
source "${_APPENDER_CONSOLE_DIR}/../formatter/formatter_plain.sh"

#-----------------------------------------------------------------------------
# 全局变量
#-----------------------------------------------------------------------------
# 存储每个appender的配置
declare -gA _CONSOLE_APPENDER_CONFIGS

#-----------------------------------------------------------------------------
# 函数: 检测终端是否支持颜色
# 返回: 0-支持, 1-不支持
#-----------------------------------------------------------------------------
function _console_supports_color() {
    # 检查是否是交互式终端
    [[ -t 1 ]] || return 1
    
    # 检查TERM环境变量
    [[ -z "${TERM:-}" ]] && return 1
    [[ "$TERM" == "dumb" ]] && return 1
    
    # 检查是否明确禁用颜色
    [[ "${NO_COLOR:-}" == "1" ]] && return 1
    [[ "${CLICOLOR}" == "0" ]] && return 1
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 初始化控制台输出器
# 参数: $1 - appender名称
# 返回: 0-成功, 1-失败
#-----------------------------------------------------------------------------
function _appender_console_init() {
    local appender_name="$1"
    
    # 初始化配置(TODO: 从配置文件读取)
    _CONSOLE_APPENDER_CONFIGS["${appender_name}_color"]="auto"
    _CONSOLE_APPENDER_CONFIGS["${appender_name}_target"]="stdout"  # stdout 或 stderr
    _CONSOLE_APPENDER_CONFIGS["${appender_name}_formatter"]="plain"
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 写入日志到控制台
# 参数: $1 - appender名称
#       $2 - 格式化后的日志文本
#       $3 - 日志事件JSON(可选,用于高级功能)
# 返回: 0-成功, 1-失败
#-----------------------------------------------------------------------------
function _appender_console_write() {
    local appender_name="$1"
    local formatted_log="$2"
    local event="${3:-}"
    
    # 获取配置
    local color_setting="${_CONSOLE_APPENDER_CONFIGS[${appender_name}_color]:-auto}"
    local target="${_CONSOLE_APPENDER_CONFIGS[${appender_name}_target]:-stdout}"
    
    # 判断是否启用颜色
    local use_color="false"
    if [[ "$color_setting" == "true" ]] || [[ "$color_setting" == "auto" && $(_console_supports_color) ]]; then
        use_color="true"
    fi
    
    # 如果启用颜色且日志未着色,添加颜色
    if [[ "$use_color" == "true" ]] && [[ -n "$event" ]]; then
        # 提取日志级别
        local level=$(echo "$event" | grep -oP '(?<="level":")[^"]*' || echo "INFO")
        local color=$(_log_level_get_color "$level")
        
        # 输出带颜色的日志
        if [[ "$target" == "stderr" ]]; then
            echo -e "${color}${formatted_log}${COLOR_RESET}" >&2
        else
            echo -e "${color}${formatted_log}${COLOR_RESET}"
        fi
    else
        # 输出普通日志
        if [[ "$target" == "stderr" ]]; then
            echo "$formatted_log" >&2
        else
            echo "$formatted_log"
        fi
    fi
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 刷新缓冲区(控制台无需特殊处理)
# 参数: $1 - appender名称
# 返回: 0-成功
#-----------------------------------------------------------------------------
function _appender_console_flush() {
    local appender_name="$1"
    # 控制台输出无缓冲,无需特殊处理
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 关闭控制台输出器
# 参数: $1 - appender名称
# 返回: 0-成功
#-----------------------------------------------------------------------------
function _appender_console_close() {
    local appender_name="$1"
    
    # 清理配置
    unset _CONSOLE_APPENDER_CONFIGS["${appender_name}_color"]
    unset _CONSOLE_APPENDER_CONFIGS["${appender_name}_target"]
    unset _CONSOLE_APPENDER_CONFIGS["${appender_name}_formatter"]
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 设置控制台输出器配置
# 参数: $1 - appender名称
#       $2 - 配置项(color/target/formatter)
#       $3 - 配置值
# 返回: 0-成功, 1-失败
#-----------------------------------------------------------------------------
function _appender_console_set_config() {
    local appender_name="$1"
    local config_key="$2"
    local config_value="$3"
    
    # 验证配置项
    case "$config_key" in
        color)
            [[ "$config_value" =~ ^(true|false|auto)$ ]] || return 1
            ;;
        target)
            [[ "$config_value" =~ ^(stdout|stderr)$ ]] || return 1
            ;;
        formatter)
            # 任意字符串
            ;;
        *)
            echo "错误: 未知配置项: $config_key" >&2
            return 1
            ;;
    esac
    
    _CONSOLE_APPENDER_CONFIGS["${appender_name}_${config_key}"]="$config_value"
    return 0
}

#-----------------------------------------------------------------------------
# 测试函数
#-----------------------------------------------------------------------------
function _appender_console_test() {
    echo "=== 控制台输出器测试 ==="
    
    # 初始化
    _appender_console_init "test_console"
    
    # 构造测试事件
    local test_event
    test_event=$(cat <<'EOF'
{
"timestamp": "2025-10-14 15:30:45",
"level": "INFO",
"message": "这是一条测试日志",
"module": "test",
"script": "test.sh",
"line": "10"
}
EOF
)
    
    echo ""
    echo "1. 基本输出测试(stdout):"
    _appender_console_set_config "test_console" "color" "false"
    _appender_console_set_config "test_console" "target" "stdout"
    _appender_console_write "test_console" "[INFO] 2025-10-14 15:30:45 - 这是一条测试日志" "$test_event"
    
    echo ""
    echo "2. 彩色输出测试(如果终端支持):"
    _appender_console_set_config "test_console" "color" "auto"
    
    # 测试不同级别
    for level in TRACE DEBUG INFO WARN ERROR FATAL; do
        local level_event
        level_event=$(cat <<EOF
{"timestamp": "2025-10-14 15:30:45","level": "$level","message": "这是${level}级别的日志"}
EOF
)
        local formatted="[$level] 2025-10-14 15:30:45 - 这是${level}级别的日志"
        _appender_console_write "test_console" "$formatted" "$level_event"
    done
    
    echo ""
    echo "3. stderr输出测试:"
    _appender_console_set_config "test_console" "target" "stderr"
    _appender_console_write "test_console" "[ERROR] 这条日志输出到stderr" "$test_event"
    
    echo ""
    echo "4. 终端颜色支持检测:"
    if _console_supports_color; then
        echo "  终端支持彩色输出"
    else
        echo "  终端不支持彩色输出"
    fi
    
    # 清理
    _appender_console_close "test_console"
}

# 如果直接执行此脚本,运行测试
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    _appender_console_test
fi

